package top.z.orm.core.osql;

import java.sql.CallableStatement;
import java.util.List;

/**
 * 存储过程方式SQL操作DB的接口
 */
public interface CallableSql {

    /**
     * @param callSql   procedure sql
     * @param entity    entity
     * @param preValues parameter,just support In type; 只支持in类型的参数
     * @return 可包含多个实体(多条记录)的list
     */
    <T> List<T> select(String callSql, T entity, Object[] preValues);

    /**
     * @param callSql   procedure sql
     * @param preValues parameter,just support In type; 只支持in类型的参数
     * @return 可包含多个String数组结构的多条记录的list
     */
    List<String[]> select(String callSql, Object[] preValues);

    /**
     * @param callSql   procedure sql
     * @param preValues parameter,just support In type; 只支持in类型的参数
     * @return 可包含多个实体(多条记录)的list转换成的json格式的字符串
     */
    String selectJson(String callSql, Object[] preValues);

    /**
     * @param callSql   procedure sql
     * @param preValues parameter,just support In type; 只支持in类型的参数
     * @return 成功操作的记录行数
     */
    Integer modify(String callSql, Object[] preValues);

    /**
     * 返回CallableStatement对象以便可以设置in,out,inout参数.可方便调用JDBC底层的方法
     *
     * @param callSql procedure sql
     * @return CallableStatement
     */
    CallableStatement getCallableStatement(String callSql);

    /**
     * 对于有out或inout类型的参数,可设置参数后,再调用该方法.
     *
     * @param cs
     * @return 成功操作的记录行数
     */
    Integer modify(CallableStatement cs);
}